package 多线程.CompletableFuture异步编排;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 allOf：必须等待所有的任务都执行完毕，才能继续执行，否则阻塞；
 anyOf：只要其中一个任务执行完毕，则继续执行。
 */
public class ThreadTest10 {
    // 自定义线程池
    public static final ExecutorService executorService = Executors.newFixedThreadPool(10);

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<String> futureA = CompletableFuture.supplyAsync(() -> {
            System.out.println("任务A开始执行...");
            System.out.println("任务A执行完毕...");
            return "A";
        }, executorService);

        CompletableFuture<String> futureB = CompletableFuture.supplyAsync(() -> {
            System.out.println("任务B开始执行...");
            System.out.println("任务B执行完毕...");
            return "B";
        }, executorService);

        CompletableFuture<String> futureC = CompletableFuture.supplyAsync(() -> {
            System.out.println("任务C开始执行...");
            System.out.println("任务C执行完毕...");
            return "C";
        }, executorService);

        // 直到所有任务都执行完毕 才能继续往下执行
        CompletableFuture<Void> allOf = CompletableFuture.allOf(futureA, futureB, futureC);
        Void unused = allOf.get();
        System.out.println(unused);
        System.out.println("A:" + futureA.get() + "B:" + futureB.get() + "C:" + futureC.get());
    }


//    output：
//    任务A开始执行...
//    任务A执行完毕...
//    任务B开始执行...
//    任务B执行完毕...
//    任务C开始执行...
//    任务C执行完毕...
//            null
//    A:AB:BC:C

}
